package com.essential.program;

/*
    除了if语句外，还有一种条件判断，是根据某个表达式的结果，分别去执行不同的分支。
    switch语句根据switch (表达式)计算的结果，跳转到匹配的case结果，然后继续执行后续语句，直到遇到break结束执行。
    使用switch语句时，只要保证有break，case的顺序不影响程序逻辑
    使用switch时，注意case语句并没有花括号{}，而且，case语句具有“穿透性”，漏写break将导致意想不到的结果
    ##编译检查
        使用IDE时，可以自动检查是否漏写了break语句和default语句，方法是打开IDE的编译检查。
        在Eclipse中，选择Preferences - Java - Compiler - Errors/Warnings - Potential programming problems，将以下检查标记为Warning：
        'switch' is missing 'default' case
        'switch' case fall-through
        在Idea中，选择Preferences - Editor - Inspections - Java - Control flow issues，将以下检查标记为Warning：
        Fallthrough in 'switch' statement
        'switch' statement without 'default' branch
        当switch语句存在问题时，即可在IDE中获得警告提示。
    ##switch JDK12
        从Java 12开始，switch语句升级为更简洁的表达式语法，使用类似模式匹配（Pattern Matching）的方法，保证只有一种路径会被执行，并且不需要break语句
    ##小结
        switch语句可以做多重选择，然后执行匹配的case语句后续代码；
        switch的计算结果必须是整型、字符串或枚举类型；
        注意千万不要漏写break，建议打开fall-through警告；
        总是写上default，建议打开missing default警告；
        从Java 14开始，switch语句正式升级为表达式，不再需要break，并且允许使用yield返回值。
 */
public class Switch {
    public static void main(String[] args) {
        /*
        switch语句根据switch (表达式)计算的结果，跳转到匹配的case结果，然后继续执行后续语句，直到遇到break结束执行。
        如果option的值没有匹配到任何case，例如option = 99，那么，switch语句不会执行任何语句。这时，可以给switch语句加一个default，当没有匹配到任何case时，执行default
        使用switch语句时，只要保证有break，case的顺序不影响程序逻辑
         */
        int option = 1;
        switch (option) {
            case 1:
                System.out.println("Selected 1");
                break;
            case 2:
                System.out.println("Selected 2");
                break;
            case 3:
                System.out.println("Selected 3");
                break;
            default:
                System.out.println("Not selected");
                break;
        }

        //JDK12 更简洁的用法
        //注意新语法使用->，如果有多条语句，需要用{}括起来。不要写break语句，因为新语法只会执行匹配的语句，没有穿透效应。
        /*
        String fruit = "apple";
        switch (fruit) {
            case "apple" -> System.out.println("Selected apple");
            case "pear" -> System.out.println("Selected pear");
            case "mango" -> {
                System.out.println("Selected mango");
                System.out.println("Good choice!");
            }
            default -> System.out.println("No fruit selected");
        }
         */

        //使用新的switch语法，不但不需要break，还可以直接返回值。
        /*
         String fruit = "apple";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> 0;
        }; // 注意赋值语句要以;结束
        System.out.println("opt = " + opt);
        }
         */
    }
}
